import request from '@/config/axios'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { AiWriteTypeEnum } from '@/views/ai/utils/constants'
import { fetchEventSource } from '@microsoft/fetch-event-source'
import { pathResolve } from '@/utils'

export interface WriteVO {
  type: AiWriteTypeEnum.WRITING | AiWriteTypeEnum.REPLY // 1:撰写 2:回复
  prompt: string // 写作内容提示 1。撰写 2回复
  originalContent: string // 原文
  length: number // 长度
  format: number // 格式
  tone: number // 语气
  language: number // 语言
  userId?: number // 用户编号
  platform?: string // 平台
  model?: string // 模型
  generatedContent?: string // 生成的内容
  errorMessage?: string // 错误信息
  createTime?: Date // 创建时间
}

export interface AiWritePageReqVO extends PageParam {
  userId?: number // 用户编号
  type?: AiWriteTypeEnum //  写作类型
  platform?: string // 平台
  createTime?: [string, string] // 创建时间
}

export interface AiWriteRespVo {
  id: number
  userId: number
  type: number
  platform: string
  model: string
  prompt: string
  generatedContent: string
  originalContent: string
  length: number
  format: number
  tone: number
  language: number
  errorMessage: string
  createTime: string
}

const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE === 'true'

export const WriteApi = {

  // 发起写作请求
  writeStream: ({
    data,
    onClose,
    onMessage,
    onError,
    ctrl
  }: {
    data: WriteVO
    onMessage?: (res: any) => void
    onError?: (...args: any[]) => void
    onClose?: (...args: any[]) => void
    ctrl: AbortController
  }) => {
    const token = getAccessToken()
    const headers = {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${token}`
    }
    // 处理租户id请求头
    if (tenantEnable) {
      // 开启租户时，有则传递请求头，没有则不传递
      const tenantId = getTenantId()
      if (tenantId != undefined) {
        headers['tenant-id'] = tenantId
      }
    } else {
      // 未开启租户时，可以传递0，配合验证租户id=0的场景，服务端未开启租户时也不影响
      headers['tenant-id'] = 0
    }
    return fetchEventSource(
      pathResolve(import.meta.env.VITE_API_BASE_URL, import.meta.env.VITE_API_PREFIX) +
        `/ai/write/generate-stream?_platform=web`,
      {
        method: 'post',
        headers: headers,
        openWhenHidden: true,
        body: JSON.stringify(data),
        onopen: async (res) => {
          // 若服务端响应非text/event-stream格式(sse响应格式)，那么终止请求重试，此时可能是认证鉴权失败，或其他服务端错误(application/json)
          if (!res.headers.get('content-type')?.startsWith('text/event-stream')) {
            let errorMsg = '服务响应异常'
            try {
              const json = JSON.parse(await res.text())
              if (json?.msg) {
                errorMsg = json.msg
              }
            } catch (error) {
            } finally {
              ctrl.abort() // 终止请求重试
              if (onError) onError(new Error(errorMsg))
            }
          }
        },
        onmessage: onMessage,
        onerror: onError,
        onclose: onClose,
        signal: ctrl.signal
      }
    )
  },

  // 获取写作列表
  getWritePage: (params: AiWritePageReqVO) => {
    return request.get<PageResult<AiWriteRespVo[]>>({ url: `/ai/write/page`, params })
  },

  // 删除写作
  deleteWrite(id: number) {
    return request.delete({ url: `/ai/write/delete`, params: { id } })
  }
}
